package modele;

import java.util.ArrayList;
import java.util.List;

/**
 * This class is a test of extensible board. Initialization depends on board's length.
 *
 */
public class CopyOfBoard {

	protected List<AbstractCell> lst;
	protected int longueur;
	
	public CopyOfBoard(int l){
		int longueur = l;

		lst = new ArrayList(java.util.Collections.nCopies(longueur, null));
		
		int[] tabGooseCell = nbGooseCell(longueur);
		int[] tabTpCell = nbTPCell(longueur);
		int[] tabTrapCell = nbTrapCell(longueur);
		int[] tabWaitCell = nbWaitCell(longueur);
		
		
		System.out.println("taille du plateau : "+lst.size());

		for(int i=0 ; i<longueur ;i=i+1){
			insertGooseCell(i,tabGooseCell,lst);
			insertWaitCell(i, tabWaitCell, lst);
			insertTrapCell(i, tabTrapCell, lst);
			insertTpCell(i, tabTpCell, lst);
			insertNormalCell(i,lst);
			System.out.print("|"+lst.get(i).numCell+lst.get(i).typeCell+"|");
		}
		
		
	}
	/*
	 * Creation d'un tableau contenant l'emplacement des cases hotel
	 */
	private int[] nbWaitCell(int longueur){
		int nbWait = (longueur-19)/44;
		int[] rslt = new int[nbWait];
		int ecart = 19;
		
		for(int i=0;i<nbWait;i=i+1){
			rslt[i] = ecart;
			ecart = ecart+44;
		}
		return rslt;	

	}
	
	/*
	 * Creation d'un tableau contenant l'emplacement des cases pieges
	 */
	private int[] nbTrapCell(int longueur){
		int nbTrap = (2*longueur)/63;
		int[] rslt = new int[nbTrap];
		int ecart = longueur/nbTrap;
		
		for(int i=0;i<nbTrap;i=i+1){
			rslt[i] = ecart;
			ecart = ecart+ecart-10;
		}
		return rslt;		
	}
	
	/*
	 * Creation d'un tableau contenant l'emplacement des cases TP
	 */
	private int[] nbTPCell(int longueur) {
		int nbTp = (3*longueur)/63;
		int[] rslt = new int[nbTp];
		int ecart = longueur/nbTp;
		
		for(int i=0;i<nbTp;i=i+1){
			rslt[i] = ecart;
			ecart = ecart+ecart;
		}
		return rslt;
	}

	/*
	 * creation d'un tableau contenant l'emplacement des cases oies.
	 */
	private static int[] nbGooseCell(int longueur){
		int nbgoose = (longueur*7)/63;
		int[] rslt = new int[nbgoose];
		int ecart = longueur/nbgoose;
		
		
		for(int i=0;i<nbgoose;i=i+1){
			rslt[i] = ecart;
			ecart = ecart+9;
		}
		return rslt;
	}
	
	/*
	 * Insertion des cases oies dans le plateau en fonction du tableau contenant l'emplacement des cases oies
	 */
	private static void insertGooseCell(int indice ,int[] tab,List<AbstractCell> lst){
		for(int i=0;i<tab.length;i=i+1){
			if(tab[i] == indice && lst.get(indice)==null){
				AbstractCell c = new GooseCell(indice);
				lst.set(indice, c);
			}
		}
	}
	
	
	/*
	 * Insertion des cases TP dans le plateau en fonction du tableau contenant l'emplacement des cases TP
	 */
	private static void insertTpCell(int indice ,int[] tab,List<AbstractCell> lst){
		for(int i=0;i<tab.length;i=i+1){
			if(tab[i] == indice && lst.get(indice)==null){
				AbstractCell c = new TeleportCell(indice, 0);
				lst.set(indice, c);
			}
		}
	}
	
	/*
	 * Insertion des cases trap dans le plateau en fonction du tableau contenant l'emplacement des cases trap
	 */
	private static void insertTrapCell(int indice ,int[] tab,List<AbstractCell> lst){
		for(int i=0;i<tab.length;i=i+1){
			if(tab[i] == indice && lst.get(indice)==null){
				AbstractCell c = new TrapCell(indice);
				lst.set(indice, c);
			}
		}
	}
	
	
	/*
	 * Insertion des Wait cells dans le plateau en fonction du tableau contenant l'emplacement des cases wait
	 */
	private static void insertWaitCell(int indice ,int[] tab,List<AbstractCell> lst){
		for(int i=0;i<tab.length;i=i+1){
			if(tab[i] == indice && lst.get(indice)==null){
				AbstractCell c = new WaitCell(indice);
				lst.set(indice, c);
			}
		}
	}
	
	
	private static void insertNormalCell(int indice ,List<AbstractCell> lst){
		if(lst.get(indice)==null){
			AbstractCell c = new NormalCell(indice);
			lst.set(indice, c);
			
		}
	}

	
	
	
	
	
}
